﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;  

namespace ScrumMagic
{
    /// <summary>
    ///  контроллер для управления формами: открыть в табе(в окне), закрыть, получить список открытых окон
    /// </summary>
    static public class FormController
    {
        public enum ContainerTypes
        {
            window,
            tab,
        }

        private static MainWindow mainForm;
        private static ArrayList formArray;

        private static Hashtable containerList = new Hashtable();

        static FormController()
        { 
            formArray = new ArrayList();
        }

        // храним экземпляр основной формы, для доступа из любой формы
        public static MainWindow MainForm
        {
            get { return mainForm; }
            set { mainForm = value; }
        }

        // открывает форму, на табе, в отдельном окне; если форма уже открыта, делает её активной
        public static void OpenForm(CommonForm FormToOpen, ContainerTypes OpenMode)
        {
            ICommonContainer Container = null;

            if (containerList.ContainsKey(FormToOpen.Title))
            {
                Container = (ICommonContainer)containerList[FormToOpen.Title];

                // if already opened in anothe mode, close it
                if (Container.Type != OpenMode)
                {
                    containerList.Remove(Container.ContainerTitle);
                    Container.CloseContainer();
                }
            }

            if (Container == null)
            {
                if (OpenMode == ContainerTypes.window)
                {
                    FormWindow NewWindow = new FormWindow(FormToOpen);
                    NewWindow.Closing += new System.ComponentModel.CancelEventHandler(NewWindow_Closing);
                    NewWindow.Closed += new EventHandler(NewWindow_Closed);
                    NewWindow.Show();
                    NewWindow.Activate();
                    Container = (ICommonContainer)NewWindow;
                }
                else // show form on tab in main window
                {
                    FormTabItem NewTabItem = new FormTabItem(FormToOpen);
                    NewTabItem.CloseTab += new ButtonHandler(NewTabItem_CloseTab);
                    MainForm.FormTabControl.Items.Add(NewTabItem);
                    //MainForm.FormTabControl.Items.Remove(NewTabItem);
                    Container = (ICommonContainer)NewTabItem;
                }
            }

            // add to hashtable
            if (!containerList.ContainsKey(FormToOpen.Title)) containerList.Add(FormToOpen.Title, Container);

            // call method OnActivated 
            FormToOpen.OnActivated();

            if (Container != null) Container.ActivateContainer();  
        }

        public static void CloseAll()
        {

            foreach (ICommonContainer s in containerList)
            {
                s.CloseContainer();
                containerList.Remove(s);   
            }



         
        }

        static void NewWindow_Closed(object sender, EventArgs e)
        {
            FormWindow WindowToClose = (FormWindow)sender;
            CommonForm FormToClose = (CommonForm)WindowToClose.Content;

            FormToClose.OnClose();
            containerList.Remove(FormToClose.Title);
        }

        static void NewWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // get form, that lays on window
            FormWindow WindowToClose = (FormWindow)sender;
            CommonForm FormToClose = (CommonForm)WindowToClose.Content;

            // if not Cancel, then close
            if (!FormToClose.OnClosing())
            {
                e.Cancel = true;
            }

        }

        // отлавливаем событие от кнопки закрытия на табе; если не было отмены, закрываем форму
        private static void NewTabItem_CloseTab(FormTabItem ItemToClose)
        {
            // get form, that lays on tab
            CommonForm FormToClose = (CommonForm)ItemToClose.Content;

            // if not Cancel, then close
            if (FormToClose.OnClosing())
            {
                FormToClose.OnClose();
                RibbonTabController.CloseTab(FormToClose);
                containerList.Remove(FormToClose.Title);
                mainForm.FormTabControl.Items.Remove(ItemToClose);
            }

        }

        public static object FindForm()
        {
            return null;
        }

        // возвращает список открытых форм(табов)
        public static Hashtable FormList
        {
            get { return containerList; }
            set { containerList  = value; }
        }
    }
}
